package com.qingxin.sys.verifier;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import javax.servlet.http.HttpServletRequest;

/**
 * 一个表单或实体对象的验证规则
 * @author Administrator
 *
 */
public class Form {
	
	private String action;
	private List<VerifyItem> items = new Vector<>();
	
	
	/**
	 * 验证表单，只要有一条验证不通过就返回
	 * 
	 * @param request
	 * @return 验证结果
	 */
	public FormMsg verify(HttpServletRequest request) {
		return verify(false, request);
	}
	
	
	/**
	 * 验证表单，只要有一条验证不通过就返回
	 * 
	 * @param formMap 表单数据
	 * @return
	 */
	public FormMsg verify(FormMap formMap){
		return verify(false, formMap);
	}
	
	
	/**
	 * 验证表单
	 * 
	 * @param verifyAll 是否全部验证：true验证全部项目、false只要有一条验证不通过就返回
	 * @param request
	 * @return 验证结果
	 */
	public FormMsg verify(boolean verifyAll, HttpServletRequest request) {
		FormMap formMap = new FormMap(request);
		return verify(verifyAll, formMap);
	}
	
	
	/**
	 * 验证表单
	 * 
	 * @param verifyAll 是否全部验证：true验证全部项目、false只要有一条验证不通过就返回
	 * @param formMap 表单数据
	 * @return 验证结果
	 */
	public FormMsg verify(boolean verifyAll, FormMap formMap) {
		FormMsg formMsg = new FormMsg(this);
		if(items.size() == 0){
			return formMsg.setPass(true);
		}
		boolean allpass = true;
		
		for(VerifyItem item : items){
			if(!item.isBackground()){
				continue;
			}
			boolean pass = item.verify(formMsg, formMap);
			if(!pass){
				allpass = false;
				if(!verifyAll){
					break;
				}
			}
		}
		return formMsg.setPass(allpass);
	}
	
	
	/**
	 * 验证表单中的指定字段
	 * 
	 * @param field
	 * @param request
	 * @return
	 */
	public FormMsg verifyField(String field, HttpServletRequest request) {
		FormMap formMap = new FormMap(request);
		return verifyField(field, formMap);
	}
	
	
	/**
	 * 验证表单中的指定字段
	 * 
	 * @param field 字段名
	 * @param formMap 表单数据
	 * @return
	 */
	public FormMsg verifyField(String field, FormMap formMap) {
		FormMsg formMsg = new FormMsg(this);
		for(VerifyItem item : items){
			if(!field.equalsIgnoreCase(item.getName())){
				continue;
			}
			boolean pass = item.verify(formMsg, formMap);
			return formMsg.setPass(pass);
		}
		return formMsg.setPass(true);
	}
	
	
	/**
	 * 获取前台验证配置
	 * 
	 * @return
	 */
	public Map<String, Object> getFormCfg(){
		Map<String, Object> map = new HashMap<String, Object>();
		List<Object> itemList = new ArrayList<Object>();
		for(VerifyItem item : items){
			if(!item.isForeground()){
				continue;
			}
			Object cfg = item.getItemCfg();
			if(cfg != null){
				itemList.add(cfg);
			}
		}
		if(itemList.size() == 0){
			return null;
		}
		map.put("items", itemList);
		return map;
	}
	
	
	public String getAction() {
		return action;
	}
	public void setAction(String action) {
		this.action = action;
	}
	public List<VerifyItem> getItems() {
		return items;
	}
	public void setItems(List<VerifyItem> items) {
		this.items = items;
	}
	public void addItem(VerifyItem item) {
		item.setForm(this);
		items.add(item);
	}
	public void mergeVerifyItems(Form form){
		if(form == null){
			return;
		}
		List<VerifyItem> verifyItems = form.getItems();
		for(VerifyItem item : verifyItems){
			addItem(item);
		}
	}
	
}
